//Pop Sequence（弹出序列）
//判断数字序列是否是正确的弹出序列

#include <stdio.h>
#include <stdlib.h>
#define MAX 1000

typedef struct sqStack
{
    int *Data;
    int top;
    int maxsize;
} *Stack;

Stack initializeStack(int M)
{
    Stack S = (Stack)malloc(sizeof(struct sqStack)); // 为栈分配内存
    S->Data = (int *)malloc(M * sizeof(int));        // 为存储数据分配内存
    S->top = -1;                                      // 栈顶初始化为-1
    S->maxsize = M;                                   // 设置栈的最大容量
    return S;
}

int isEmpty(Stack S)
{
    return S->top == -1;
}

void Push(Stack S, int value)
{
    if (S->top < S->maxsize - 1) {
        S->Data[++(S->top)] = value;
    }
}

int Pop(Stack S)
{
    if (!isEmpty(S)) {
        return S->Data[(S->top)--];
    }
    return -1; // 代表栈空
}

void checkPopSequence(Stack S, int A[], int N)
{
    int j = 0; // A数组的索引
    for (int i = 1; i <= N; i++)
    {
        Push(S, i); // 将当前值 i 压入栈
        while (!isEmpty(S) && A[j] == S->Data[S->top]) {
            Pop(S); // 如果栈顶元素等于当前要检查的元素 A[j]，则弹出栈顶元素
            j++; // 移动到下一个要检查的元素
        }
    }
    // 检查是否所有元素都已匹配
    if (isEmpty(S) && j == N) {
        printf("YES\n"); // 所有元素均匹配
    } else {
        printf("NO\n"); // 有元素未匹配
    }
}

int main()
{
    int M, N, K; 
    int A[MAX];
    
    scanf("%d%d%d", &M, &N, &K);
    
    while (K--)
    {
        Stack S = initializeStack(M); // 为每次测试初始化栈
        for (int i = 0; i < N; i++) {
            scanf("%d", &A[i]); // 输入待验证的弹出序列
        }
        checkPopSequence(S, A, N); // 检查序列
        free(S->Data); // 释放内存
        free(S);
    }
    return 0;
}
